home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-04-25 | 13.7 KB | 554 lines | [TEXT/CWIE] |
- // ==================================================
- // UFileTools.cp
- // Copyright (C) 1994-1997 Mizutori Tetsuya
- // March 5, 1997
- // ==================================================
- // All documents are pretty-printed in 10-point Geneva font.
-
- #include <Files.h>
- #include <Processes.h>
- #include <Types.h>
- #include <LowMem.h>
-
- #include "UFileTools.h"
- #include <UEnvironment.h>
-
-
- // ==================================================
- // • Constructors
- // ==================================================
-
- // --------------------------------------------------
- // • UFileTools()
- // --------------------------------------------------
-
- UFileTools::UFileTools()
- {
- }
-
-
- // --------------------------------------------------
- // • ~UFileTools()
- // --------------------------------------------------
-
- UFileTools::~UFileTools()
- {
- }
-
-
- // ==================================================
- // Member functions (Get and Set the date time stamp)
- // ==================================================
-
- // --------------------------------------------------
- // • GetFSSpecDateTime
- // --------------------------------------------------
- // Get the creation/modification date time of the given FSSpec.
-
- OSErr
- UFileTools::GetFSSpecDateTime(
- FSSpec & inFSSpec,
- unsigned long & outCreationDate,
- unsigned long & outModificationDate )
- {
- OSErr err;
-
- if ( GetFSSpecType( inFSSpec ) == fileType_File ) {
- err = GetFileDateTime( inFSSpec, outCreationDate, outModificationDate );
- } else {
- err = GetFolderDateTime( inFSSpec, outCreationDate, outModificationDate );
- }
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • SetFSSpecDateTime
- // --------------------------------------------------
- // Set the creation/modification date time of the given FSSpec.
-
- OSErr
- UFileTools::SetFSSpecDateTime(
- FSSpec & inFSSpec,
- unsigned long inCreationDate,
- unsigned long inModificationDate )
- {
- OSErr err;
-
- if ( GetFSSpecType( inFSSpec ) == fileType_File ) {
- err = SetFileDateTime( inFSSpec, inCreationDate, inModificationDate );
- } else {
- err = SetFolderDateTime( inFSSpec, inCreationDate, inModificationDate );
- }
-
- TouchDir( inFSSpec.vRefNum, inFSSpec.parID );
- ::FlushVol( NULL, inFSSpec.vRefNum );
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • GetFileDateTime
- // --------------------------------------------------
-
- OSErr
- UFileTools::GetFileDateTime(
- FSSpec & inFSSpec,
- unsigned long & outCreationDate,
- unsigned long & outModificationDate )
- {
- OSErr err;
- CInfoPBRec paramBlock;
-
- paramBlock.hFileInfo.ioNamePtr = inFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = inFSSpec.parID;
- paramBlock.hFileInfo.ioFDirIndex = 0;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- outCreationDate = paramBlock.hFileInfo.ioFlCrDat;
- outModificationDate = paramBlock.hFileInfo.ioFlMdDat;
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • SetFileDateTime
- // --------------------------------------------------
-
- OSErr
- UFileTools::SetFileDateTime(
- FSSpec & inFSSpec,
- unsigned long inCreationDate,
- unsigned long inModificationDate )
- {
- OSErr err;
- CInfoPBRec paramBlock;
-
- paramBlock.hFileInfo.ioNamePtr = inFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = inFSSpec.parID;
- paramBlock.hFileInfo.ioFDirIndex = 0;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- paramBlock.hFileInfo.ioNamePtr = inFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = inFSSpec.parID;
- if ( inCreationDate != 0 ) paramBlock.hFileInfo.ioFlCrDat = inCreationDate;
- if ( inModificationDate != 0 ) paramBlock.hFileInfo.ioFlMdDat = inModificationDate;
-
- err = ::PBSetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- // TouchDir( inFSSpec.vRefNum, inFSSpec.parID );
- // ::PBFlushFileSync( (ParmBlkPtr) ¶mBlock );
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • GetFolderDateTime
- // --------------------------------------------------
-
- OSErr
- UFileTools::GetFolderDateTime(
- FSSpec & inFSSpec,
- unsigned long & outCreationDate,
- unsigned long & outModificationDate )
- {
- OSErr err;
- CInfoPBRec paramBlock;
-
- paramBlock.dirInfo.ioNamePtr = inFSSpec.name;
- paramBlock.dirInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.dirInfo.ioDrDirID = inFSSpec.parID;
- paramBlock.dirInfo.ioFDirIndex = 0;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- outCreationDate = paramBlock.dirInfo.ioDrCrDat;
- outModificationDate = paramBlock.dirInfo.ioDrMdDat;
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • SetFolderDateTime
- // --------------------------------------------------
-
- OSErr
- UFileTools::SetFolderDateTime(
- FSSpec & inFSSpec,
- unsigned long inCreationDate,
- unsigned long inModificationDate )
- {
- OSErr err;
- CInfoPBRec paramBlock;
-
- paramBlock.dirInfo.ioNamePtr = inFSSpec.name;
- paramBlock.dirInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.dirInfo.ioDrDirID = inFSSpec.parID;
- paramBlock.dirInfo.ioFDirIndex = 0;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- paramBlock.dirInfo.ioNamePtr = inFSSpec.name;
- paramBlock.dirInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.dirInfo.ioDrDirID = inFSSpec.parID;
- if ( inCreationDate != 0 ) paramBlock.dirInfo.ioDrCrDat = inCreationDate;
- if ( inModificationDate != 0 ) paramBlock.dirInfo.ioDrMdDat = inModificationDate;
-
- err = ::PBSetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- // TouchDir( inFSSpec.vRefNum, inFSSpec.parID );
- // ::PBFlushVolSync( (ParmBlkPtr) ¶mBlock );
-
- return err;
- }
-
-
- // ==================================================
- // Member functions (Finder's info)
- // ==================================================
-
- // --------------------------------------------------
- // • TouchDir
- // --------------------------------------------------
- // Update the finder's folder status.
-
- OSErr
- UFileTools::TouchDir(
- short inVRefNum,
- long inDirID )
- {
- CInfoPBRec paramBlock;
- Str255 theFilename;
- OSErr err;
-
- paramBlock.dirInfo.ioDrDirID = inDirID;
- paramBlock.dirInfo.ioVRefNum = inVRefNum;
- paramBlock.dirInfo.ioNamePtr = theFilename;
- paramBlock.dirInfo.ioFDirIndex = -1;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
-
- if ( err == noErr ) {
- paramBlock.dirInfo.ioCompletion = 0;
- paramBlock.dirInfo.ioDrDirID = paramBlock.dirInfo.ioDrParID;
- paramBlock.dirInfo.ioFDirIndex = 0;
- ::GetDateTime( ¶mBlock.dirInfo.ioDrMdDat );
-
- err = ::PBSetCatInfoSync( ¶mBlock );
- }
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • GetFSSpecType
- // --------------------------------------------------
- // Test the file type of a particular file
-
- EFileType
- UFileTools::GetFSSpecType(
- FSSpec & inFSSpec )
- {
- OSErr err;
- EFileType theFileType;
-
- if ( (inFSSpec.parID) == fsRtParID ) {
-
- theFileType = fileType_Volume;
-
- } else {
-
- CInfoPBRec paramBlock;
- paramBlock.hFileInfo.ioFDirIndex = 0;
- paramBlock.hFileInfo.ioNamePtr = inFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = inFSSpec.parID;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
-
- if ( err == noErr ) {
- if ( (paramBlock.hFileInfo.ioFlAttrib & 0x10) != 0 )
- theFileType = fileType_Folder;
- else
- theFileType = fileType_File;
- } else {
- theFileType = fileType_Unknown;
- }
-
- }
-
- return theFileType;
- }
-
-
- // --------------------------------------------------
- // • QueryFile
- // --------------------------------------------------
- // input:
- // inFSSpec ;; a FSSpec for an existing file or directory.
- // output:
- // outFileType ;; file type { fileType_File ; fileType_Folder }.
- // outFileID ;; the id of the file or directory.
- // return err if no such a file or directory exists.
-
- OSErr
- UFileTools::QueryFile(
- FSSpec & inFSSpec,
- EFileType & outFileType,
- long & outFileID )
- {
- OSErr err;
- CInfoPBRec paramBlock;
-
- paramBlock.hFileInfo.ioFDirIndex = 0;
- paramBlock.hFileInfo.ioNamePtr = inFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = inFSSpec.parID;
-
- // paramBlock.dirInfo.ioFDirIndex = 0;
- // paramBlock.dirInfo.ioNamePtr = inFSSpec.name;
- // paramBlock.dirInfo.ioVRefNum = inFSSpec.vRefNum;
- // paramBlock.dirInfo.ioDrDirID = inFSSpec.parID;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- // Determine the file type; a file or a directory.
- if ( (paramBlock.hFileInfo.ioFlAttrib & 0x10) != 0 ) {
- outFileType = fileType_Folder;
- outFileID = paramBlock.dirInfo.ioDrDirID;
- } else {
- outFileType = fileType_File;
- outFileID = paramBlock.hFileInfo.ioDirID;
- }
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • SearchDirectory
- // --------------------------------------------------
- // Search a particure directory for the files in it.
- // Returns the file spec for the particular index number with noErr.
- // Otherwise returns with no-noErr code if exist no more files.
- // Root directory number is 'fsRtDirID(2)'.
- // Parent directory number of root is 'fsRtParID(1)'.
- // Example. FSSpec of directory path = "tmp:abc:" is {.vRefNum=?,.parID=2, .name="abc"}
-
- OSErr
- UFileTools::SearchDirectory(
- long inIndex, // begins with one.
- FSSpec & inDirSpec, // root directory
- FSSpec & outFSSpec,
- EFileType & outFileType )
- {
- OSErr err;
-
- // Check whether the inDirSpec is a directory. If it is, then get its directory ID.
- EFileType fileType;
- long dirID;
- err = QueryFile( inDirSpec, fileType, dirID );
- if ( err != noErr ) return err;
- if ( fileType != fileType_Folder ) return fnfErr;
-
- err = SearchDirectory( inIndex, inDirSpec.vRefNum, dirID, outFSSpec, outFileType );
-
- return err;
- }
-
-
- OSErr
- UFileTools::SearchDirectory(
- long inIndex, // begins with one.
- short inVRefNum,
- long inDirID,
- FSSpec & outFSSpec,
- EFileType & outFileType )
- {
- OSErr err = fnfErr;
- if ( inIndex <= 0 ) return err; // index must begin with one.
-
- // Set outFSSpec that this is in the same directory.
- outFSSpec.vRefNum = inVRefNum;
- outFSSpec.parID = inDirID;
-
- // Determine the file or directory whose index number is inIndex in the directory dirID.
- CInfoPBRec paramBlock;
- paramBlock.hFileInfo.ioFDirIndex = inIndex;
- paramBlock.hFileInfo.ioNamePtr = outFSSpec.name;
- paramBlock.hFileInfo.ioVRefNum = outFSSpec.vRefNum;
- paramBlock.hFileInfo.ioDirID = outFSSpec.parID;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) return err;
-
- // Determine the file type; a file or a directory.
- if ( (paramBlock.hFileInfo.ioFlAttrib & 0x10) != 0 ) {
- outFileType = fileType_Folder;
- // outFileID = paramBlock.dirInfo.ioDrDirID;
- } else {
- outFileType = fileType_File;
- // outFileID = paramBlock.hFileInfo.ioDirID;
- }
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • GetFullPathname
- // --------------------------------------------------
- // Get the full pathname of a particular file.
-
- OSErr
- UFileTools::GetFullPathname(
- const FSSpec & inFSSpec,
- Str255 outPathname,
- Boolean inAddFilename ) // = false
- {
- OSErr err = noErr;
-
- // Let's start with the file name.
- if ( inAddFilename ) {
- PStrCopy( outPathname, inFSSpec.name );
- } else {
- PStrCopy( outPathname, "\p" );
- }
-
- CInfoPBRec paramBlock;
- Str255 theDirName;
-
- // Next, get the parent directory name, and insert it to the pathname.
- paramBlock.dirInfo.ioNamePtr = theDirName;
- paramBlock.dirInfo.ioDrParID = inFSSpec.parID;
-
- do {
- paramBlock.dirInfo.ioVRefNum = inFSSpec.vRefNum;
- paramBlock.dirInfo.ioFDirIndex = -1;
- paramBlock.dirInfo.ioDrDirID = paramBlock.dirInfo.ioDrParID;
-
- err = ::PBGetCatInfoSync( ¶mBlock );
- if ( err != noErr ) break;
-
- PStrAppend( theDirName, "\p:" );
- PStrAppend( theDirName, outPathname );
- PStrCopy( outPathname, theDirName );
-
- } while ( paramBlock.dirInfo.ioDrDirID != fsRtDirID );
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • GetCurrentApplicationFile
- // --------------------------------------------------
- // Get the file spec of the current application process.
-
- OSErr
- UFileTools::GetCurrentApplicationFile(
- FSSpec & outFSSpec )
- {
- OSErr err;
-
- ProcessSerialNumber theProcessID;
- err = ::GetCurrentProcess( &theProcessID );
- if ( err != noErr ) return err;
-
- // Str63 processName;
- ProcessInfoRec theProcessInfo;
- theProcessInfo.processName = NULL; // processName; // We don't need process name, here.
- theProcessInfo.processAppSpec = &outFSSpec; // Allocate the storage for FSSpec.
- err = ::GetProcessInformation( &theProcessID, &theProcessInfo );
- if ( err != noErr ) return err;
-
- return err;
- }
-
-
- // ==================================================
- // Common functions (handling p-strings)
- // ==================================================
-
- const long kMaxString = 255;
-
- // --------------------------------------------------
- // • PStrCopy
- // --------------------------------------------------
-
- void
- UFileTools::PStrCopy(
- Str255 dstP,
- const Str255 srcP )
- {
- dstP[0] = srcP[0];
- ::BlockMoveData( &srcP[1], &dstP[1], dstP[0] );
- }
-
-
- void
- UFileTools::PStrCopy(
- Str255 dstP,
- const unsigned char * srcP,
- const long length )
- {
- long k = length;
- dstP[0] = ( k > kMaxString ? kMaxString : k );
-
- ::BlockMoveData( srcP, &dstP[1], dstP[0] );
- }
-
-
- // --------------------------------------------------
- // • PStrAppend
- // --------------------------------------------------
-
- void
- UFileTools::PStrAppend(
- Str255 dstP,
- const Str255 srcP )
- {
- long n = dstP[0];
-
- long k = (long) dstP[0] + (long) srcP[0];
- dstP[0] = ( k > kMaxString ? kMaxString : k );
-
- ::BlockMoveData( &srcP[1], &dstP[1+n], dstP[0]-n );
- }
-
-
- void
- UFileTools::PStrAppend(
- Str255 dstP,
- const unsigned char * srcP,
- const long length )
- {
- long n = dstP[0];
-
- long k = (long) dstP[0] + length;
- dstP[0] = ( k > kMaxString ? kMaxString : k );
-
- ::BlockMoveData( srcP, &dstP[1+n], dstP[0]-n );
- }
-
-
- // end of program
-